import behavior from './behavior/index';
import config, { setConfig } from './config';
import error from './error/index';
import { sendReport } from './export';
import performance from './performance/index';
import ErrorStackParser from 'error-stack-parser';

window.__webEyeSDK__ = {
  version: '0.0.1',
};

// 针对vue项目的错误捕获
export function install(Vue, options) {
  // 如果__webEyeSDK__已经安装过vue插件，则直接返回
  if (__webEyeSDK__.vue) return;
  // 标记__webEyeSDK__已经安装过vue插件
  __webEyeSDK__.vue = true;

  setConfig(options);

  // 获取Vue的错误处理函数
  const handler = Vue.config.errorHandler;

  /**
   * 重写vue的错误处理函数
   * @param {*} err vue错误对象，包含错误信息和错误栈
   * @param {*} vm vue实例
   * @param {*} info 错误信息, 包含组件名等
   */
  Vue.config.errorHandler = function (err, vm, info) {
    const errorStack = ErrorStackParser.parse(err);

    // 上报错误信息
    const reportData = {
      info,
      position: errorStack[0],
      subType: 'vue',
      type: 'error',
      startTime: window.performance.now(),
      pageURL: window.location.href,
      config: {
        ...config,
        batchSize: 1,
      },
    };
    sendReport(reportData);
    // 如果有原来的错误处理函数，则调用原来的错误处理函数
    if (handler) {
      handler.call(this, err, vm, info);
    }
  };
}

/**
 * 针对react项目的错误捕获
 * @param {*} err
 * @returns
 */
function errorBoundary(err, info) {
  // 如果__webEyeSDK__已经安装过react插件，则直接返回
  if (__webEyeSDK__.react) return;
  __webEyeSDK__.react = true;

  const reportData = {
    info,
    error: err.stack,
    subType: 'react',
    type: 'error',
    startTime: window.performance.now(),
    pageURL: window.location.href,
  };
  sendReport(reportData);
}

export const init = (options) => {
  setConfig(options);
  error();
  // performance();
  // behavior();
};

export default {
  install,
  errorBoundary,
  performance,
  error,
  behavior,
  init,
};
